package com.yjpark.apps.netcalc;

import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;

import android.app.Activity;
import android.content.Context;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.Canvas;
import android.graphics.drawable.Drawable;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Base64;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.Gallery;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;
import android.widget.AdapterView.OnItemClickListener;

public class GalleryActivity extends Activity {
    
    Intent intent;
    
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.gallery_layout);

        intent = new Intent();
        
        Gallery gal = (Gallery) findViewById(R.id.gallery1);
        gal.setAdapter(new ImageAdapter(this));

        gal.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                // toast 띄우기 - 선택된 이미지 번호
                Toast.makeText(GalleryActivity.this, "" + position, Toast.LENGTH_SHORT).show();
                
                ImageView imgView = (ImageView) findViewById(R.id.imageView1);
                int imgID = (Integer) parent.getItemAtPosition(position);
                imgView.setImageResource(imgID);
                
                // 선택된 이미지 thumbnail bitmap 생성
                imgView.setDrawingCacheEnabled(true);
                if(imgView.isDrawingCacheEnabled()) {
                    Bitmap thumbnail = imgView.getDrawingCache();
                    
                    // intent.putExtra 로 처리
                    setProfileImageBase64(thumbnail);
                }
                imgView.setDrawingCacheEnabled(false);
            }
        });
        
        
        // 기존에 선택된 프로필 이미지가 있을 경우 - #ing#
//        String profileImageBase64_setted = intent.getStringExtra("profileImageBase64");
//        if(profileImageBase64_setted.length() > 0 && profileImageBase64_setted != null) {
//            // base64 decode -> byte[] -> inputstream -> bitmap
//            byte[] image = Base64.decode(profileImageBase64_setted, Base64.DEFAULT);
//            ByteArrayInputStream stream = new ByteArrayInputStream(image);
//            Bitmap bm = BitmapFactory.decodeStream(stream);
//            
//            ImageView imgView = (ImageView)findViewById(R.id.imageView1);
//            imgView.setImageBitmap(bm);
//        }
        
    }

    // ================================= //
    public void onClickOK(View view) {
        setResult(RESULT_OK, intent);
        finish();
    }

    public void onClickCancel(View view) {
        super.onBackPressed();
    }

    // ================================= //
    // thumbnail
    private static int TAKE_PICTURE = 1;

    public void onClickCamera(View view) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        startActivityForResult(intent, TAKE_PICTURE);

    }

    // Full
    private Uri outputFileUri;

    public void onClickCamera2(View view) {
        Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
        File file = new File(Environment.getExternalStorageDirectory(), "/sample.jpg");
        outputFileUri = Uri.fromFile(file);
        intent.putExtra(MediaStore.EXTRA_OUTPUT, outputFileUri);
        startActivityForResult(intent, TAKE_PICTURE);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub

        if (requestCode == TAKE_PICTURE) {
            if (data != null) {
                if (data.hasExtra("data")) {
                    Bitmap thumbnail = data.getParcelableExtra("data");
                    ImageView imgView = (ImageView) findViewById(R.id.imageView1);
                    imgView.setImageBitmap(thumbnail);
                    // thumbmail
                    
                    // intent.putExtra 로 처리
                    setProfileImageBase64(thumbnail);
                    
                }
            }
        } else {
            ImageView imgView = (ImageView) findViewById(R.id.imageView1);
            imgView.setImageURI(outputFileUri);
            // Full

//            System.out.println("outputFileUri:"+outputFileUri);
        }
    }

    public void setProfileImageBase64(Bitmap bm) {
        if(bm == null)
            return;
        
        // bitmap -> outputstream -> byte[] -> base64 encode
        ByteArrayOutputStream stream = new ByteArrayOutputStream();
        bm.compress(CompressFormat.PNG, 100, stream);
        byte[] image = stream.toByteArray();
        String profileImageBase64 = Base64.encodeToString(image, Base64.DEFAULT);
        
        // intent 에 설정
        intent.putExtra("profileImageBase64", profileImageBase64);
    }
    
    
    /**
     * 기본 갤러리 이용시
     */
    /**
    public void onClickCamera(View view) {
        // 카메라 촬영을 할 수 있는 액티비티를 실행할 수 있도록 인텐트 객체를 생성한다.
        Intent intent = new Intent(
                android.provider.MediaStore.ACTION_IMAGE_CAPTURE);
        try {
            // 고유영역에 test_picture.jpg 라는 쓰기용 파일을 생성한다.
            // 이 때, 다른 어플리케이션이 이 파일에 데이터를 쓸 수 있도록 속성을 부여한다.
            FileOutputStream fos = openFileOutput("test_picture.jpg",
                    Context.MODE_WORLD_WRITEABLE);
            // 파일 출력 스트림을 닫는다.
            fos.close();

            // 어플리케이션의 고유영역 경로를 File 객체로 얻는다.
            File path = getFilesDir();
            // 고유영역에 있는 test_picture.jpg 파일의 객체를 얻는다.
            File file = new File(path, "test_picture.jpg");

            // File 객체의 URI 를 얻는다.
            Uri uri = Uri.fromFile(file);
            // 인텐트에 URI 정보를 저장한다.
            // 카메라 액티비티는 이 URI 에 입력된 경로에 촬영한 이미지를 저장한다.
            intent.putExtra(android.provider.MediaStore.EXTRA_OUTPUT, uri);

            Log.d("GalleryActivity", "uri:" + uri);

            // 인텐트 정보에 맞는 액티비티를 실행한다.
            startActivityForResult(intent, 0);
        } catch (IOException ie) {
            // 파일 입출력에 관한 예외 발생시 예외사항을 출력한다.
            // TextView tv = (TextView) findViewById(R.id.id_tv);
            // tv.setText(ie.toString());
        }
    }

    @Override
    protected void onActivityResult(int request_code, int result_code, Intent data) {
        // 결과 값이 있고, 액티비티를 시작할 때 0로 설정해둔 결과값인 경우
        if (request_code == 0 && result_code == RESULT_OK) {
            try {
                // 어플리케이션의 고유영역 경로를 File 객체로 얻는다.
                File path = getFilesDir();
                // 고유영역에 있는 test_picture.jpg 파일의 객체를 얻는다.
                File file = new File(path, "test_picture.jpg");
                // 파일 객체를 이용하여 파일 입력 스트림을 생성한다.
                FileInputStream input_stream = new FileInputStream(file);

                // id_image 라는 ID 의 이미지뷰를 얻는다.
                ImageView img_view = (ImageView) findViewById(R.id.imageView1);

                // 기존에 이미지가 설정되어 있었다면 설정된 이미지를 해제한다.
                img_view.setImageDrawable(null);

                // 입력 스트림을 이용하여 Drawable 객체를 생성하고,
                // 해당 객체를 이미지뷰에 출력시킨다.
                img_view.setImageDrawable(Drawable.createFromStream(
                        input_stream, "image.jpg"));

                // 파일 입력 스트림을 닫는다.
                input_stream.close();

                // 가비지 컬렉션을 수행한다.
                // 메모리 해제가 수동으로 되지 않기때문에 직접 수행시켜야
                // 메모리 부족으로 프로그램이 중지되지 않는다.
                // 단, 이 작업이 부하가 크기때문에 자주 사용하는 것을 권장하지 않는다.
                // 나중에 이것을 보완할 다른 방법에 대하여 알아보도록 하겠다.
                // System.gc();
            } catch (Exception ie) {
                // 파일 입출력에 관한 예외 발생시 예외사항을 출력한다.
                // TextView tv = (TextView) findViewById(R.id.id_tv);
                // tv.setText(ie.toString());
            }
        }
    }
     */

}